package com.adee.primary.t01_arr;


import com.adee.util.Util;

import java.util.Arrays;
import java.util.Scanner;

public class T001 {
    public static void main(String[] args) {
        // 3 10 1 8 22 13 118 7 19 33 10 9 7 10 1 1 13 8 8 8 8 19
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            // 读取一行
            String s = in.nextLine();
            String[] arr = s.split("\\s");
            int[] ints = Arrays.stream(arr).mapToInt(Integer::parseInt).toArray();
            // 排序
            Arrays.sort(ints);
            Util.print(ints);
            // 去重
            Util.print(test1(Arrays.copyOf(ints, ints.length)));
            Util.print(test2(ints));
        }
    }

    /**
     * 删除排序数组中的重复项
     * 原地算法 in-place  循环
     *
     */
    public static int[] test1(int[] arr) {
        int len = arr.length;
        if(arr == null || len <= 1) return arr;
        int i = 1;
        int prev = 0;
        int subLen = len;
        ret:
        while (i < subLen) {
            while (arr[i] == arr[prev] && i < subLen) {
                ++i;
            }
            if (i == subLen) {
                break ret;
            } else {
                if (i > prev + 1) {
                    // i~subLen-1 复制到 prev+1~prev+1+(subLen-i)   长度为 subLen-i
                    System.arraycopy(arr, i, arr, prev+1, subLen-i);
                    subLen -= i-prev-1;
                }
                ++prev;
                i = prev + 1;
            }
        }
        // 此时，prev就是尾元素的下标
        return Arrays.copyOfRange(arr, 0, prev+1);
    }

    /**
     * 删除排序数组中的重复项
     * 新建一个数组，遍历原数组，将不重复元素放入新数组
     *
     */
    public static int[] test2(int[] arr) {
        if (arr == null || arr.length == 0) return null;
        int[] copy = new int[arr.length];
        int i = 1, j = 0;
        copy[0] = arr[0];
        while (i < arr.length) {
            if (arr[i] == copy[j]){
                i++;
            }else {
                copy[++j] = arr[i++];
            }
        }
        return Arrays.copyOfRange(copy, 0, j+1);
    }

}
